package org.jeecg.modules.fund.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpException;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.List;

/**
 * 基金工具
 */
@Slf4j
public class FundDataUtil {
    /**
     * 获取基金历史数据
     * @param code
     * @return
     */
    public static JSONObject getFundValueList(String code){
        try {
            // 请求获取明细数据
            String res = HttpUtil.get("https://fund.eastmoney.com/pingzhongdata/" + code + ".js");
            // 正则提取数据
            String re01 = ReUtil.get("Data_netWorthTrend(.*?)累计净值走势",res,0);
            // 进一步提取数组
            String re02 = ReUtil.get("\\[(.*?)\\]",re01,0);
            // 构造数据参数
            JSONObject data = new JSONObject();
            // 插入数据列表
            data.put("list",JSON.parseArray(re02));
            // 插入近1年收益率
            data.put("syl_1n",getFundSyl("syl_1n(.*?);",res));
            // 插入近6个月收益率
            data.put("syl_6y",getFundSyl("syl_6y(.*?);",res));
            // 插入近3个月收益率
            data.put("syl_3y",getFundSyl("syl_3y(.*?);",res));
            // 插入近1个月收益率
            data.put("syl_1y",getFundSyl("syl_1y(.*?);",res));
            // 转化为数组
            return data;
        } catch (Exception e) {
            // throw new RuntimeException(e);
            // log.error("【爬虫数据】净值数据获取异常：" + code);
            // log.error(e.getMessage());
            return null;
        }
    }

    /**
     * 获取收益率
     * @param regStr
     * @param param
     * @return
     */
    public static String getFundSyl(String regStr,String param){
        // 正则提取数据
        String res = ReUtil.get(regStr,param,0);
        // 留下双引号及数据
        String res02 = ReUtil.get("\"(.*?)\"",res,0);
        return res02.replace("\"","");
    }

    /**
     * 获取估值
     * @param code
     * @return
     */
    public static JSONObject getEstimateVal(String code){
        try {
            // 请求获取明细数据
            String res = HttpUtil.get("https://fundgz.1234567.com.cn/js/" + code + ".js");
            // 正则提取数据
            String re01 = ReUtil.get("\\{(.*?)\\}",res,0);
            return JSONObject.parseObject(re01);
        } catch (Exception e) {
            // throw new RuntimeException(e);
            // log.error(e.getMessage());
            // log.error("错误的基金代码：" + code);
            return null;
        }
    }

    /**
     * 格式化日期
     * @param date
     * @return
     */
    public static Date formatDate(String date){
        Instant instant = Instant.ofEpochSecond(Long.parseLong(date) / 1000                                                                                                                                                                                                          );
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
        LocalDate localDate = zonedDateTime.toLocalDate();
        return DateUtil.parse(localDate + "");
    }

    public static void main(String args[]){
        // 请求获取明细数据
        // String res = null;
//        String res = HttpUtil.get("https://fundgz.1234567.com.cn/js/" + "004997" + ".js");
//        try {
//            //JSONObject object = getFundValueList("003244");
//            //log.info(object.toJSONString());
//        } catch (HttpException e) {
//            throw new RuntimeException(e);
//        }
//        // 正则提取数据
//        // String re01 = ReUtil.get("Data_netWorthTrend(.*?)累计净值走势",res,0);
//        // System.out.println(ReUtil.get("\\{(.*?)\\}",res,0));
//        System.out.println(Runtime.getRuntime().availableProcessors());
//        //log.info(DateUtil.offsetDay(new Date(),-59).toDateStr());

        JSONObject object = getFundValueList("021959");
//        JSONArray arr = object.getJSONArray("list");
//
//        List<Object> a = arr.subList(0,5);
        log.info(object.toJSONString());

    }
}
